Brian Durán

Tarea: Sesión 4 y 5


I Parte


  1. Sea \(P=(2,3)\), \(Q=(5,2)\), \(R=(2,-5)\) y \(S=(1,-2)\). Calcule \(proy_{\vec{PQ}}\vec{RS}\).

\(\vec{PQ}\)

q <- c(5,2)
p <- c(2,3)
pq <- q - p
pq
[1]  3 -1

\(\vec{RS}\)

r <- c(2,-5)
s <- c(1,-2)
rs <- s - r
rs
[1] -1  3


\(proy_{\vec{PQ}}\vec{RS}\)


proy <- project(rs, pq)

fractions(proy)
[1] -9/5  3/5


  1. Sea \(u = (-2,1,6)\) y \(v = (2,4,5)\), comprueba que el vector \(w\) dado por \(w = u - \frac{u \cdot v}{\|v\|^2} v\) Es un vector ortogonal con \(v\)

Calculamos:

\(u \cdot v\)

u <- c(-2,1,6)
v <- c(2,4,5)
sum(u*v)
[1] 30

\({\|v\|^2}\)


v2 <- norm(v, type="2")^2
v2
[1] 45

\(w = u - \frac{u \cdot v}{\|v\|^2} v\)


prod_punto_u_v = sum(u*v)

w = u - ((prod_punto_u_v / v2) * v)

w = fractions(w)

sum(w*v)
[1] 0
subspace(as.matrix(w),as.matrix(v))
[1] 1.570796
180*subspace(as.matrix(w),as.matrix(v))/pi
[1] 90

\(W _{\bot } V ?\)

w es ortogonal con v, ya que la múltiplicación entre ellos es igual a cero. Además de que el ángulo que los separa es igual a \(\pi\ /2\)

  1. Sean \(A=(3,0,0)\), \(B=(1,0,2)\), \(C=(2,3,0)\) puntos en el espacio (\(R^3\)).

Con estos puntos:

  1. Determine si el triángulo \(ABC\) es rectángulo, obtusángulo o acutángulo.
a <- c(3,0,0)
b <- c(1,0,2)
c <- c(2,3,0)

ab <- b-a
bc <- c-b
ca <- a-c

180*subspace(as.matrix(ab), as.matrix(bc))/pi
[1] 55.46242
180*subspace(as.matrix(bc), as.matrix(ca))/pi
[1] 47.45855
180*subspace(as.matrix(ab), as.matrix(ca))/pi
[1] 77.07903

Respuesta: El triángulo es acutángulo, ya que todos sus ángulos se encuentran entre 0 y 90 grados.

  1. Determine el perímetro del triángulo \(ABC\)
norma_ab <- norm(ab, type="2")
norma_bc <- norm(bc, type="2")
norma_ca <- norm(ca, type="2")

perimetro <- norma_ab + norma_bc + norma_ca
perimetro
[1] 9.732362
  1. Determine el área del triángulo ABC
semiperimetro <- perimetro / 2

# Por formula de Héron
area = sqrt(semiperimetro * (semiperimetro - norma_ab) * (semiperimetro - norma_bc) * (semiperimetro - norma_ca))

area
[1] 4.358899


II Parte


  1. Compruebe que la matriz P, es ortogonal:
p <- matrix(c(1/2, 1/2, 1/2, 1/2, 
              (1/sqrt(2)), -(1/sqrt(2)), 0, 0, 
              (1/sqrt(6)), (1/sqrt(6)), -(2/sqrt(6)), 0, 
              (1/(2*sqrt(3))), (1/(2*sqrt(3))), (1/(2*sqrt(3))), -(3/(2*sqrt(3)))), 
              nrow=4, ncol=4, byrow=TRUE)

matriz_p <- fractions(p)

matriz_p
     [,1]           [,2]           [,3]           [,4]          
[1,]            1/2            1/2            1/2            1/2
[2,]      2378/3363     -5741/8119              0              0
[3,]    19402/47525    19402/47525  -86329/105731              0
[4,]   75658/262087   75658/262087   75658/262087 -489061/564719
p_inversa <- solve(matriz_p)

fractions(p_inversa)
     [,1]           [,2]           [,3]           [,4]          
[1,]            1/2      2378/3363    19402/47525   75658/262087
[2,]            1/2     -5741/8119    19402/47525   75658/262087
[3,]            1/2              0  -86329/105731   75658/262087
[4,]            1/2              0              0 -489061/564719
p_transpuesta <- t(p)

fractions(p_transpuesta)
     [,1]           [,2]           [,3]           [,4]          
[1,]            1/2      2378/3363    19402/47525   75658/262087
[2,]            1/2     -5741/8119    19402/47525   75658/262087
[3,]            1/2              0  -86329/105731   75658/262087
[4,]            1/2              0              0 -489061/564719

La matriz P es ortogonal puesto que su inversa y su transpuesta son iguales.

  1. Demuestre que A es indempotente.
a <- matrix(c(2, -2, -4, 
              -1, 3, 4,
              1, -2, -3), 
              3, 3, byrow=TRUE)


a
     [,1] [,2] [,3]
[1,]    2   -2   -4
[2,]   -1    3    4
[3,]    1   -2   -3
a%*%a
     [,1] [,2] [,3]
[1,]    2   -2   -4
[2,]   -1    3    4
[3,]    1   -2   -3

La matriz A es idempotente puesto que es igual a ella misma al cuadrado.

  1. Determine la composición \(f(m)\)
m <- matrix(c(3/2, -5/2, 
              2/3, -1/3), 
              2, 2, byrow=TRUE)

fractions(m)
     [,1] [,2]
[1,]  3/2 -5/2
[2,]  2/3 -1/3
m3 <- m%*%m%*%m

m2 <- m%*%m

fx = 6*m3 + 3*m2 - m

fractions(fx)
     [,1]   [,2]  
[1,]  -37/6  -55/6
[2,]   22/9 -116/9
  1. Encuentre la matriz inversa y el determinante de cada una de las siguientes matrices:

a <- matrix(c(1, 2, 3, 
              2, 5, 7,
              -2, -4, -5), 
              3, 3, byrow=TRUE)

solve(a)
     [,1] [,2] [,3]
[1,]    3   -2   -1
[2,]   -4    1   -1
[3,]    2    0    1
det(a)
[1] 1
b <- matrix(c(3, -2, -1, 
              -4, 1, -1,
              2, 0, 1), 
              3, 3, byrow=TRUE)

solve(b)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    5    7
[3,]   -2   -4   -5
det(b)
[1] 1
c <- matrix(c(0, 2, 1, 
              1, 3, -1,
              -1, 1, 2), 
              3, 3, byrow=TRUE)

fractions(solve(c))
     [,1] [,2] [,3]
[1,]  7/2 -3/2 -5/2
[2,] -1/2  1/2  1/2

La última matriz no tiene inversa puesto que el determinante es cero, es decir la matriz es singular o invertible.

Que relación existe entre las matrices que poseen inversas y el valor de su determinante? Sug: revisar la teoría vista en clase.
Cuando una matriz posee inversa, se puede asumir que su determinante es mayor a cero.


  1. ¿Cómo se propaga una enfermedad contagiosa?. Suponga que un grupo de 4 individuos que llamaremos \(I_{1}, I_{2}, I_{3}, I_{4}\), han contraído una enfermedad.

Este grupo entra en contacto con 6 personas de un segundo grupo: \(P_{1}, P_{2}, P_{3}, P_{4}, P_{5}, P_{6}\). Este tipo de contactos se llaman directos y se pueden representar en una matriz de 4 x 6, como la que se muestra a continuación:

Note que la forma de construir dicha matriz es, colocando un 1 si una persona del primer grupo (contagiados) entra en contacto con alguna persona del segundo grupo.

Llamemos \(A\) a esta matriz de contactos Primer Contacto Directo:

Ahora suponga que las 6 personas del grupo 2 entró en contacto directo con un tercer grupo de cinco personas \(M_{1}, M_{2}, M_{3}, M_{4}, M_{5}, M_{6}\) de la siguiente manera:

Llamamos \(B\) a esta segunda matriz de contacto:


La lógica es igual que en el caso anterior, 1 significa que un individuo del segundo grupo estuvo en contacto con un individuo del tercer grupo. Los contactos indirectos o de segundo orden, se pueden dar entre individuos del primer grupo con individuos del tercer grupo, esto es, que una persona del grupo 3, puede ser contagiada por alguien del grupo 2 que a su vez fue contagiada por alguien del grupo 1. A manera de ejemplo, note que las posiciones \(a_{24}=1\ y \ b_{45}=1\), con esto, se ve que indirectamente la quinta persona del grupo 3, tuvo contacto con una persona del grupo 1 a través de la cuarta persona del grupo 2, así:


Con respecto al caso anterior, realice los siguiente:

  1. Calcule una nueva matriz \(C\), tal que \(C=A \cdot B\) (Tome en cuenta que el producto es matricial, al trabajarlo en R).

a_encabezados = list(c("I1", "I2", "I3", "I4"), c("P1", "P2", "P3", "P4", "P5", "P6"))

a <- matrix(c(0, 1, 0, 0, 1, 0,
              1, 0, 0, 1, 0, 1,
              0, 0, 0, 1, 1, 0,
              1, 0, 0, 0, 0, 1),
              4, 6, byrow=TRUE, dimnames=a_encabezados)

a
   P1 P2 P3 P4 P5 P6
I1  0  1  0  0  1  0
I2  1  0  0  1  0  1
I3  0  0  0  1  1  0
I4  1  0  0  0  0  1
b_encabezados = list(c("P1", "P2", "P3", "P4", "P5", "P6"), c("M1", "M2", "M3", "M4", "M5"))

b <- matrix(c(0, 0, 1, 0, 1,
              0, 0, 0, 1, 0,
              0, 1, 0, 0, 0,
              1, 0, 0, 0, 1,
              0, 0, 0, 1, 0,
              0, 0, 1, 0, 0),
              6, 5, byrow=TRUE, dimnames=b_encabezados)
b
   M1 M2 M3 M4 M5
P1  0  0  1  0  1
P2  0  0  0  1  0
P3  0  1  0  0  0
P4  1  0  0  0  1
P5  0  0  0  1  0
P6  0  0  1  0  0
c <- a%*%b
c
   M1 M2 M3 M4 M5
I1  0  0  0  2  0
I2  1  0  2  0  2
I3  1  0  0  1  1
I4  0  0  2  0  1
  1. ¿Cuáles grupos de individuos (Grupo 1, 2 o 3) están quedando representados en \(C\)?, ¿quiénes están representados en las filas y quiénes en las columnas?

En la matriz \(C\) se están representanto los individuos de los tres grupos, ya que se demuestran los contactos directos e indirectos. Las filas representan a los individuos del grupo 1 (\(I\)) y la sumatoria de la fila representa los contactos indirectos que tuvo el individuo \(I_n\) con miembros del grupo \(M\) a través de miembros del grupo \(P\). Las columnas representan a los miembros del grupo 3 (\(M\)) y la sumatoria de la columna la cantidad total de contactos indirectos que tuvo el individuo (\(M_n\)) con individuos del grupo \(I\) a través de \(P\).

  1. Tome la fila 2 de \(C\) e interprétela (haga la extracción de esta usando un comando apropiado en R).
c[2,]
M1 M2 M3 M4 M5 
 1  0  2  0  2 

El individuo \(I_{2}\) fue la persona que más contagio a miembros del grupo \(M\) de manera indirecta.

  1. Tome la columna 2 y 5 de \(C\) e interprételas (Use comandos apropiados en R para la extracción)
c[,2]
I1 I2 I3 I4 
 0  0  0  0 

El individuo \(M_{2}\) no tuvo contacto con algún \(P\) que tuviera contacto con algún \(I\). Por lo tanto \(M_{2}\) no fue contagiado.

c[,5]
I1 I2 I3 I4 
 0  2  1  1 

El individuo \(M_{5}\) fue el miembro del grupo 3 que más contactos indirectos tuvo con miembros del grupo 1 \(I\).

  1. Interprete la posición \(C_{43}\) (Extraiga la entrada, usando el comando apropiado en R).
c[4,3]
[1] 2

El individuo \(I_4\) tuvo 2 contactos indirectos con el miembro \(M_3\) a través de 2 miembros del grupo 2 (\(P\))

 


Autor Brian Duran

 

LS0tDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQouaW5kZW50IHsNCiBtYXJnaW4tbGVmdDogMzBweDsNCn0NCmBgYA0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbGlicmFyeShwcmFjbWEpDQpsaWJyYXJ5KG1vc2FpYykNCmxpYnJhcnkoTUFTUykNCmBgYA0KDQojIyMgQnJpYW4gRHVyw6FuDQohW10oLi4vbG9nb19jaWVuY2lhX2RlX2RhdG9zLnBuZykNCg0KPGgxPjxjZW50ZXI+IFRhcmVhOiBTZXNpw7NuIDQgeSA1IDwvY2VudGVyPjwvaDE+DQoNCjwvYnI+DQoNCiMjIyMgSSBQYXJ0ZQ0KDQo8L2JyPg0KDQoxLiBTZWEgJFA9KDIsMykkLCAkUT0oNSwyKSQsICRSPSgyLC01KSQgeSAkUz0oMSwtMikkLiBDYWxjdWxlICRwcm95X3tcdmVje1BRfX1cdmVje1JTfSQuDQoNCiAgJFx2ZWN7UFF9JA0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQpxIDwtIGMoNSwyKQ0KcCA8LSBjKDIsMykNCnBxIDwtIHEgLSBwDQpwcQ0KDQpgYGANCg0KICAkXHZlY3tSU30kDQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCnIgPC0gYygyLC01KQ0KcyA8LSBjKDEsLTIpDQpycyA8LSBzIC0gcg0KcnMNCg0KYGBgDQoNCjwvYnI+DQoNCiRwcm95X3tcdmVje1BRfX1cdmVje1JTfSQNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KDQpwcm95IDwtIHByb2plY3QocnMsIHBxKQ0KDQpmcmFjdGlvbnMocHJveSkNCg0KYGBgDQoNCjwvYnI+DQoNCjIuIFNlYSAkdSA9ICgtMiwxLDYpJCB5ICR2ID0gKDIsNCw1KSQsIGNvbXBydWViYSBxdWUgZWwgdmVjdG9yICR3JCBkYWRvIHBvciAkdyA9IHUgLSBcZnJhY3t1IFxjZG90IHZ9e1x8dlx8XjJ9IHYkDQpFcyB1biB2ZWN0b3Igb3J0b2dvbmFsIGNvbiAkdiQNCg0KQ2FsY3VsYW1vczoNCg0KJHUgXGNkb3QgdiQNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KdSA8LSBjKC0yLDEsNikNCnYgPC0gYygyLDQsNSkNCnN1bSh1KnYpDQpgYGANCg0KJHtcfHZcfF4yfSQNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KDQp2MiA8LSBub3JtKHYsIHR5cGU9IjIiKV4yDQp2Mg0KYGBgDQoNCiR3ID0gdSAtIFxmcmFje3UgXGNkb3Qgdn17XHx2XHxeMn0gdiQNCg0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQoNCnByb2RfcHVudG9fdV92ID0gc3VtKHUqdikNCg0KdyA9IHUgLSAoKHByb2RfcHVudG9fdV92IC8gdjIpICogdikNCg0KdyA9IGZyYWN0aW9ucyh3KQ0KDQpzdW0odyp2KQ0KDQpzdWJzcGFjZShhcy5tYXRyaXgodyksYXMubWF0cml4KHYpKQ0KDQoxODAqc3Vic3BhY2UoYXMubWF0cml4KHcpLGFzLm1hdHJpeCh2KSkvcGkNCg0KYGBgDQoNCiRXIF97XGJvdCB9IFYgPyQNCg0KdyBlcyBvcnRvZ29uYWwgY29uIHYsIHlhIHF1ZSBsYSBtw7psdGlwbGljYWNpw7NuIGVudHJlIGVsbG9zIGVzIGlndWFsIGEgY2Vyby4gQWRlbcOhcyBkZSBxdWUgZWwgw6FuZ3VsbyBxdWUgbG9zIHNlcGFyYSBlcyBpZ3VhbCBhICRccGlcIC8yJA0KDQoNCg0KMy4gU2VhbiAkQT0oMywwLDApJCwgJEI9KDEsMCwyKSQsICRDPSgyLDMsMCkkIHB1bnRvcyBlbiBlbCBlc3BhY2lvICgkUl4zJCkuIA0KDQpDb24gZXN0b3MgcHVudG9zOg0KDQogIGEuIERldGVybWluZSBzaSBlbCB0cmnDoW5ndWxvICRBQkMkIGVzIHJlY3TDoW5ndWxvLCBvYnR1c8Ohbmd1bG8gbyBhY3V0w6FuZ3Vsby4NCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KYSA8LSBjKDMsMCwwKQ0KYiA8LSBjKDEsMCwyKQ0KYyA8LSBjKDIsMywwKQ0KDQphYiA8LSBiLWENCmJjIDwtIGMtYg0KY2EgPC0gYS1jDQoNCjE4MCpzdWJzcGFjZShhcy5tYXRyaXgoYWIpLCBhcy5tYXRyaXgoYmMpKS9waQ0KMTgwKnN1YnNwYWNlKGFzLm1hdHJpeChiYyksIGFzLm1hdHJpeChjYSkpL3BpDQoxODAqc3Vic3BhY2UoYXMubWF0cml4KGFiKSwgYXMubWF0cml4KGNhKSkvcGkNCg0KYGBgDQoNCg0KUmVzcHVlc3RhOiBFbCB0cmnDoW5ndWxvIGVzIGFjdXTDoW5ndWxvLCB5YSBxdWUgdG9kb3Mgc3VzIMOhbmd1bG9zIHNlIGVuY3VlbnRyYW4gZW50cmUgMCB5IDkwIGdyYWRvcy4NCg0KDQpiLiBEZXRlcm1pbmUgZWwgcGVyw61tZXRybyBkZWwgdHJpw6FuZ3VsbyAkQUJDJA0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQpub3JtYV9hYiA8LSBub3JtKGFiLCB0eXBlPSIyIikNCm5vcm1hX2JjIDwtIG5vcm0oYmMsIHR5cGU9IjIiKQ0Kbm9ybWFfY2EgPC0gbm9ybShjYSwgdHlwZT0iMiIpDQoNCnBlcmltZXRybyA8LSBub3JtYV9hYiArIG5vcm1hX2JjICsgbm9ybWFfY2ENCnBlcmltZXRybw0KYGBgDQoNCg0KYy4gRGV0ZXJtaW5lIGVsIMOhcmVhIGRlbCB0cmnDoW5ndWxvIEFCQw0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0Kc2VtaXBlcmltZXRybyA8LSBwZXJpbWV0cm8gLyAyDQoNCiMgUG9yIGZvcm11bGEgZGUgSMOpcm9uDQphcmVhID0gc3FydChzZW1pcGVyaW1ldHJvICogKHNlbWlwZXJpbWV0cm8gLSBub3JtYV9hYikgKiAoc2VtaXBlcmltZXRybyAtIG5vcm1hX2JjKSAqIChzZW1pcGVyaW1ldHJvIC0gbm9ybWFfY2EpKQ0KDQphcmVhDQoNCmBgYA0KDQoNCjwvYnI+DQoNCiMjIyMgSUkgUGFydGUNCg0KPC9icj4NCg0KDQoxLiBDb21wcnVlYmUgcXVlIGxhIG1hdHJpeiBQLCBlcyBvcnRvZ29uYWw6DQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCnAgPC0gbWF0cml4KGMoMS8yLCAxLzIsIDEvMiwgMS8yLCANCiAgICAgICAgICAgICAgKDEvc3FydCgyKSksIC0oMS9zcXJ0KDIpKSwgMCwgMCwgDQogICAgICAgICAgICAgICgxL3NxcnQoNikpLCAoMS9zcXJ0KDYpKSwgLSgyL3NxcnQoNikpLCAwLCANCiAgICAgICAgICAgICAgKDEvKDIqc3FydCgzKSkpLCAoMS8oMipzcXJ0KDMpKSksICgxLygyKnNxcnQoMykpKSwgLSgzLygyKnNxcnQoMykpKSksIA0KICAgICAgICAgICAgICBucm93PTQsIG5jb2w9NCwgYnlyb3c9VFJVRSkNCg0KbWF0cml6X3AgPC0gZnJhY3Rpb25zKHApDQoNCm1hdHJpel9wDQoNCg0KcF9pbnZlcnNhIDwtIHNvbHZlKG1hdHJpel9wKQ0KDQpmcmFjdGlvbnMocF9pbnZlcnNhKQ0KDQoNCnBfdHJhbnNwdWVzdGEgPC0gdChwKQ0KDQpmcmFjdGlvbnMocF90cmFuc3B1ZXN0YSkNCg0KYGBgDQoNCkxhIG1hdHJpeiBQIGVzIG9ydG9nb25hbCBwdWVzdG8gcXVlIHN1IGludmVyc2EgeSBzdSB0cmFuc3B1ZXN0YSBzb24gaWd1YWxlcy4NCg0KDQoyLiBEZW11ZXN0cmUgcXVlIEEgZXMgaW5kZW1wb3RlbnRlLg0KDQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCmEgPC0gbWF0cml4KGMoMiwgLTIsIC00LCANCiAgICAgICAgICAgICAgLTEsIDMsIDQsDQogICAgICAgICAgICAgIDEsIC0yLCAtMyksIA0KICAgICAgICAgICAgICAzLCAzLCBieXJvdz1UUlVFKQ0KDQoNCmENCg0KYSUqJWENCg0KYGBgDQoNCg0KTGEgbWF0cml6IEEgZXMgaWRlbXBvdGVudGUgcHVlc3RvIHF1ZSBlcyBpZ3VhbCBhIGVsbGEgbWlzbWEgYWwgY3VhZHJhZG8uDQoNCg0KMy4gRGV0ZXJtaW5lIGxhIGNvbXBvc2ljacOzbiAkZihtKSQNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KbSA8LSBtYXRyaXgoYygzLzIsIC01LzIsIA0KICAgICAgICAgICAgICAyLzMsIC0xLzMpLCANCiAgICAgICAgICAgICAgMiwgMiwgYnlyb3c9VFJVRSkNCg0KZnJhY3Rpb25zKG0pDQoNCm0zIDwtIG0lKiVtJSolbQ0KDQptMiA8LSBtJSolbQ0KDQpmeCA9IDYqbTMgKyAzKm0yIC0gbQ0KDQpmcmFjdGlvbnMoZngpDQoNCmBgYA0KDQoNCg0KNC4gRW5jdWVudHJlIGxhIG1hdHJpeiBpbnZlcnNhIHkgZWwgZGV0ZXJtaW5hbnRlIGRlIGNhZGEgdW5hIGRlIGxhcyBzaWd1aWVudGVzIG1hdHJpY2VzOg0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQoNCmEgPC0gbWF0cml4KGMoMSwgMiwgMywgDQogICAgICAgICAgICAgIDIsIDUsIDcsDQogICAgICAgICAgICAgIC0yLCAtNCwgLTUpLCANCiAgICAgICAgICAgICAgMywgMywgYnlyb3c9VFJVRSkNCg0Kc29sdmUoYSkNCmRldChhKQ0KDQpiIDwtIG1hdHJpeChjKDMsIC0yLCAtMSwgDQogICAgICAgICAgICAgIC00LCAxLCAtMSwNCiAgICAgICAgICAgICAgMiwgMCwgMSksIA0KICAgICAgICAgICAgICAzLCAzLCBieXJvdz1UUlVFKQ0KDQpzb2x2ZShiKQ0KZGV0KGIpDQoNCg0KYyA8LSBtYXRyaXgoYygwLCAyLCAxLCANCiAgICAgICAgICAgICAgMSwgMywgLTEsDQogICAgICAgICAgICAgIC0xLCAxLCAyKSwgDQogICAgICAgICAgICAgIDMsIDMsIGJ5cm93PVRSVUUpDQoNCmZyYWN0aW9ucyhzb2x2ZShjKSkNCmRldChjKQ0KDQpkIDwtIG1hdHJpeChjKDMsIDYsIDksIA0KICAgICAgICAgICAgICAyLCA1LCAxLA0KICAgICAgICAgICAgICAxLCAxLCA4KSwgDQogICAgICAgICAgICAgIDMsIDMsIGJ5cm93PVRSVUUpDQoNCmRldChkKQ0KDQpgYGANCg0KTGEgw7psdGltYSBtYXRyaXogbm8gdGllbmUgaW52ZXJzYSBwdWVzdG8gcXVlIGVsIGRldGVybWluYW50ZSBlcyBjZXJvLCBlcyBkZWNpciBsYSBtYXRyaXogZXMgc2luZ3VsYXIgbyBpbnZlcnRpYmxlLg0KDQoNClF1ZSByZWxhY2nDs24gZXhpc3RlIGVudHJlIGxhcyBtYXRyaWNlcyBxdWUgcG9zZWVuIGludmVyc2FzIHkgZWwgdmFsb3IgZGUgc3UgZGV0ZXJtaW5hbnRlPyBTdWc6IHJldmlzYXIgbGEgdGVvcsOtYSB2aXN0YSBlbiBjbGFzZS4NCjwvYnI+Q3VhbmRvIHVuYSBtYXRyaXogcG9zZWUgaW52ZXJzYSwgc2UgcHVlZGUgYXN1bWlyIHF1ZSBzdSBkZXRlcm1pbmFudGUgZXMgbWF5b3IgYSBjZXJvLg0KDQoNCjwvYnI+DQoNCjUuIMK/Q8OzbW8gc2UgcHJvcGFnYSB1bmEgZW5mZXJtZWRhZCBjb250YWdpb3NhPy4gU3Vwb25nYSBxdWUgdW4gZ3J1cG8gZGUgNCBpbmRpdmlkdW9zIHF1ZSBsbGFtYXJlbW9zICRJX3sxfSwgSV97Mn0sIElfezN9LCBJX3s0fSQsIGhhbiBjb250cmHDrWRvIHVuYSBlbmZlcm1lZGFkLg0KDQpFc3RlIGdydXBvIGVudHJhIGVuIGNvbnRhY3RvIGNvbiA2IHBlcnNvbmFzIGRlIHVuIHNlZ3VuZG8gZ3J1cG86ICRQX3sxfSwgUF97Mn0sIFBfezN9LCBQX3s0fSwgUF97NX0sIFBfezZ9JC4gRXN0ZSB0aXBvIGRlIGNvbnRhY3RvcyBzZSBsbGFtYW4gZGlyZWN0b3MgeSBzZSBwdWVkZW4gcmVwcmVzZW50YXIgZW4gdW5hIG1hdHJpeiBkZSA0IHggNiwgY29tbyBsYSBxdWUgc2UgbXVlc3RyYSBhIGNvbnRpbnVhY2nDs246DQoNCjxjZW50ZXI+IVtdKG1hdHJpel9jb250YWdpby5wbmcpPC9jZW50ZXI+DQoNCk5vdGUgcXVlIGxhIGZvcm1hIGRlIGNvbnN0cnVpciBkaWNoYSBtYXRyaXogZXMsIGNvbG9jYW5kbyB1biAxIHNpIHVuYSBwZXJzb25hIGRlbCBwcmltZXIgZ3J1cG8gKGNvbnRhZ2lhZG9zKSBlbnRyYSBlbiBjb250YWN0byBjb24gYWxndW5hIHBlcnNvbmEgZGVsIHNlZ3VuZG8gZ3J1cG8uDQoNCkxsYW1lbW9zICRBJCBhIGVzdGEgbWF0cml6IGRlIGNvbnRhY3RvcyBQcmltZXIgQ29udGFjdG8gRGlyZWN0bzoNCg0KPGNlbnRlcj4hW10obWF0cml6X2EucG5nKTwvY2VudGVyPg0KDQpBaG9yYSBzdXBvbmdhIHF1ZSBsYXMgNiBwZXJzb25hcyBkZWwgZ3J1cG8gMiBlbnRyw7MgZW4gY29udGFjdG8gZGlyZWN0byBjb24gdW4gdGVyY2VyIGdydXBvDQpkZSBjaW5jbyBwZXJzb25hcyAkTV97MX0sIE1fezJ9LCBNX3szfSwgTV97NH0sIE1fezV9LCBNX3s2fSQgZGUgbGEgc2lndWllbnRlIG1hbmVyYToNCg0KPGNlbnRlcj4hW10obWF0cml6X2NvbnRhZ2lvX2luZGlyZWN0by5wbmcpPC9jZW50ZXI+DQoNCkxsYW1hbW9zICRCJCBhIGVzdGEgc2VndW5kYSBtYXRyaXogZGUgY29udGFjdG86DQoNCjxjZW50ZXI+IVtdKG1hdHJpel9iLnBuZyk8L2NlbnRlcj4NCg0KPC9icj4NCg0KTGEgbMOzZ2ljYSBlcyBpZ3VhbCBxdWUgZW4gZWwgY2FzbyBhbnRlcmlvciwgMSBzaWduaWZpY2EgcXVlIHVuIGluZGl2aWR1byBkZWwgc2VndW5kbyBncnVwbyBlc3R1dm8gZW4gY29udGFjdG8gY29uIHVuIGluZGl2aWR1byBkZWwgdGVyY2VyIGdydXBvLiBMb3MgY29udGFjdG9zIGluZGlyZWN0b3MgbyBkZSBzZWd1bmRvIG9yZGVuLCBzZSBwdWVkZW4gZGFyIGVudHJlIGluZGl2aWR1b3MgZGVsIHByaW1lciBncnVwbyBjb24gaW5kaXZpZHVvcyBkZWwgdGVyY2VyIGdydXBvLCBlc3RvIGVzLCBxdWUgdW5hIHBlcnNvbmEgZGVsIGdydXBvIDMsIHB1ZWRlIHNlciBjb250YWdpYWRhIHBvciBhbGd1aWVuIGRlbCBncnVwbyAyIHF1ZSBhIHN1IHZleiBmdWUgY29udGFnaWFkYSBwb3IgYWxndWllbiBkZWwgZ3J1cG8gMS4gQSBtYW5lcmEgZGUgZWplbXBsbywgbm90ZSBxdWUgbGFzIHBvc2ljaW9uZXMgJGFfezI0fT0xXCB5IFwgYl97NDV9PTEkLCBjb24gZXN0bywgc2UgdmUgcXVlIGluZGlyZWN0YW1lbnRlIGxhIHF1aW50YSBwZXJzb25hIGRlbCBncnVwbyAzLCB0dXZvIGNvbnRhY3RvIGNvbiB1bmEgcGVyc29uYSBkZWwgZ3J1cG8gMSBhIHRyYXbDqXMgZGUgbGEgY3VhcnRhIHBlcnNvbmEgZGVsIGdydXBvIDIsIGFzw606DQoNCjxjZW50ZXI+IVtdKGFycm93cy5wbmcpPC9jZW50ZXI+DQoNCjwvYnI+DQoNCkNvbiByZXNwZWN0byBhbCBjYXNvIGFudGVyaW9yLCByZWFsaWNlIGxvcyBzaWd1aWVudGU6DQoNCmEuIENhbGN1bGUgdW5hIG51ZXZhIG1hdHJpeiAkQyQsIHRhbCBxdWUgJEM9QSBcY2RvdCBCJCAoVG9tZSBlbiBjdWVudGEgcXVlIGVsIHByb2R1Y3RvIGVzIG1hdHJpY2lhbCwgYWwgdHJhYmFqYXJsbyBlbiBSKS4NCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KDQphX2VuY2FiZXphZG9zID0gbGlzdChjKCJJMSIsICJJMiIsICJJMyIsICJJNCIpLCBjKCJQMSIsICJQMiIsICJQMyIsICJQNCIsICJQNSIsICJQNiIpKQ0KDQphIDwtIG1hdHJpeChjKDAsIDEsIDAsIDAsIDEsIDAsDQogICAgICAgICAgICAgIDEsIDAsIDAsIDEsIDAsIDEsDQogICAgICAgICAgICAgIDAsIDAsIDAsIDEsIDEsIDAsDQogICAgICAgICAgICAgIDEsIDAsIDAsIDAsIDAsIDEpLA0KICAgICAgICAgICAgICA0LCA2LCBieXJvdz1UUlVFLCBkaW1uYW1lcz1hX2VuY2FiZXphZG9zKQ0KDQphDQoNCmJfZW5jYWJlemFkb3MgPSBsaXN0KGMoIlAxIiwgIlAyIiwgIlAzIiwgIlA0IiwgIlA1IiwgIlA2IiksIGMoIk0xIiwgIk0yIiwgIk0zIiwgIk00IiwgIk01IikpDQoNCmIgPC0gbWF0cml4KGMoMCwgMCwgMSwgMCwgMSwNCiAgICAgICAgICAgICAgMCwgMCwgMCwgMSwgMCwNCiAgICAgICAgICAgICAgMCwgMSwgMCwgMCwgMCwNCiAgICAgICAgICAgICAgMSwgMCwgMCwgMCwgMSwNCiAgICAgICAgICAgICAgMCwgMCwgMCwgMSwgMCwNCiAgICAgICAgICAgICAgMCwgMCwgMSwgMCwgMCksDQogICAgICAgICAgICAgIDYsIDUsIGJ5cm93PVRSVUUsIGRpbW5hbWVzPWJfZW5jYWJlemFkb3MpDQpiDQoNCmMgPC0gYSUqJWINCmMNCg0KYGBgDQoNCmIuIMK/Q3XDoWxlcyBncnVwb3MgZGUgaW5kaXZpZHVvcyAoR3J1cG8gMSwgMiBvIDMpIGVzdMOhbiBxdWVkYW5kbyByZXByZXNlbnRhZG9zIGVuICRDJD8sIMK/cXVpw6luZXMgZXN0w6FuIHJlcHJlc2VudGFkb3MgZW4gbGFzIGZpbGFzIHkgcXVpw6luZXMgZW4gbGFzIGNvbHVtbmFzPw0KDQpFbiBsYSBtYXRyaXogJEMkIHNlIGVzdMOhbiByZXByZXNlbnRhbnRvIGxvcyBpbmRpdmlkdW9zIGRlIGxvcyB0cmVzIGdydXBvcywgeWEgcXVlIHNlIGRlbXVlc3RyYW4gbG9zIGNvbnRhY3RvcyBkaXJlY3RvcyBlIGluZGlyZWN0b3MuIExhcyBmaWxhcyByZXByZXNlbnRhbiBhIGxvcyBpbmRpdmlkdW9zIGRlbCBncnVwbyAxICgkSSQpIHkgbGEgc3VtYXRvcmlhIGRlIGxhIGZpbGEgcmVwcmVzZW50YSBsb3MgY29udGFjdG9zIGluZGlyZWN0b3MgcXVlIHR1dm8gZWwgaW5kaXZpZHVvICRJX24kIGNvbiBtaWVtYnJvcyBkZWwgZ3J1cG8gJE0kIGEgdHJhdsOpcyBkZSBtaWVtYnJvcyBkZWwgZ3J1cG8gJFAkLiBMYXMgY29sdW1uYXMgcmVwcmVzZW50YW4gYSBsb3MgbWllbWJyb3MgZGVsIGdydXBvIDMgKCRNJCkgeSBsYSBzdW1hdG9yaWEgZGUgbGEgY29sdW1uYSBsYSBjYW50aWRhZCB0b3RhbCBkZSBjb250YWN0b3MgaW5kaXJlY3RvcyBxdWUgdHV2byBlbCBpbmRpdmlkdW8gKCRNX24kKSBjb24gaW5kaXZpZHVvcyBkZWwgZ3J1cG8gJEkkIGEgdHJhdsOpcyBkZSAkUCQuDQoNCg0KYy4gVG9tZSBsYSBmaWxhIDIgZGUgJEMkIGUgaW50ZXJwcsOpdGVsYSAoaGFnYSBsYSBleHRyYWNjacOzbiBkZSBlc3RhIHVzYW5kbyB1biBjb21hbmRvIGFwcm9waWFkbyBlbiBSKS4NCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCmNbMixdDQpgYGANCg0KRWwgaW5kaXZpZHVvICRJX3syfSQgZnVlIGxhIHBlcnNvbmEgcXVlIG3DoXMgY29udGFnaW8gYSBtaWVtYnJvcyBkZWwgZ3J1cG8gJE0kIGRlIG1hbmVyYSBpbmRpcmVjdGEuDQoNCg0KZC4gVG9tZSBsYSBjb2x1bW5hIDIgeSA1IGRlICRDJCBlIGludGVycHLDqXRlbGFzIChVc2UgY29tYW5kb3MgYXByb3BpYWRvcyBlbiBSIHBhcmEgbGEgZXh0cmFjY2nDs24pDQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCmNbLDJdDQpgYGANCg0KRWwgaW5kaXZpZHVvICRNX3syfSQgbm8gdHV2byBjb250YWN0byBjb24gYWxnw7puICRQJCBxdWUgdHV2aWVyYSBjb250YWN0byBjb24gYWxnw7puICRJJC4gUG9yIGxvIHRhbnRvICRNX3syfSQgbm8gZnVlIGNvbnRhZ2lhZG8uDQoNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KY1ssNV0NCmBgYA0KDQpFbCBpbmRpdmlkdW8gJE1fezV9JCBmdWUgZWwgbWllbWJybyBkZWwgZ3J1cG8gMyBxdWUgbcOhcyBjb250YWN0b3MgaW5kaXJlY3RvcyB0dXZvIGNvbiBtaWVtYnJvcyBkZWwgZ3J1cG8gMSAkSSQuDQoNCg0KZS4gSW50ZXJwcmV0ZSBsYSBwb3NpY2nDs24gJENfezQzfSQgKEV4dHJhaWdhIGxhIGVudHJhZGEsIHVzYW5kbyBlbCBjb21hbmRvIGFwcm9waWFkbyBlbiBSKS4NCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KY1s0LDNdDQpgYGANCg0KRWwgaW5kaXZpZHVvICRJXzQkIHR1dm8gKioyKiogY29udGFjdG9zIGluZGlyZWN0b3MgY29uIGVsIG1pZW1icm8gJE1fMyQgYSB0cmF2w6lzIGRlIDIgbWllbWJyb3MgZGVsIGdydXBvIDIgKCRQJCkNCg0KDQo8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPg0KPCEtLQ0KRXN0YSBzZWNjacOzbiBlcyBzb2xvIHBhcmEgYWdyZWdhciBlc3RpbG9zIHkgZWxlbWVudG9zIA0KcGVyc29uYWxpemFkb3MgYWwgaHRtbCBnZW5lcmFkbyBwb3IgclN0dWRpbyAgDQotLT4NCjwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+DQoNCiZuYnNwOw0KDQo8aHIgLz4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij5BdXRvciA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmR1cmFucyI+QnJpYW4gRHVyYW48L2E+PC9wPg0KPHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzgwODA4MDsiPjxlbT5iZHVyYW4wMzkzQGdtYWlsLmNvbTwvZW0+PC9zcGFuPjwvcD4NCg0KPCEtLSBBZGQgaWNvbiBsaWJyYXJ5IC0tPg0KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9mb250LWF3ZXNvbWUvNC43LjAvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIj4NCg0KPCEtLSBBZGQgZm9udCBhd2Vzb21lIGljb25zIC0tPg0KPHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iZHVyYW5zL3RlY19kYXRhX3NjaWVuY2VfY291cnNlL3RyZWUvbWFzdGVyL21hdGhlbWF0aWNzX2Zvcl9kYXRhX3NjaWVuY2Uvc2Vzc2lvbl80X2FuZF81X2hvbWV3b3JrIiBjbGFzcz0iZmEgZmEtZ2l0aHViIj48L2E+DQo8L3A+DQoNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iZHVyYW5zL3RlY19kYXRhX3NjaWVuY2VfY291cnNlL3RyZWUvbWFzdGVyL21hdGhlbWF0aWNzX2Zvcl9kYXRhX3NjaWVuY2Uvc2Vzc2lvbl80X2FuZF81X2hvbWV3b3JrIiBjbGFzcz0iZ2l0aHViLWNvcm5lciIgYXJpYS1sYWJlbD0iVmlldyBzb3VyY2Ugb24gR2l0SHViIj48c3ZnIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgdmlld0JveD0iMCAwIDI1MCAyNTAiIHN0eWxlPSJmaWxsOiMxNTE1MTM7IGNvbG9yOiNmZmY7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBib3JkZXI6IDA7IHJpZ2h0OiAwOyIgYXJpYS1oaWRkZW49InRydWUiPjxwYXRoIGQ9Ik0wLDAgTDExNSwxMTUgTDEzMCwxMTUgTDE0MiwxNDIgTDI1MCwyNTAgTDI1MCwwIFoiPjwvcGF0aD48cGF0aCBkPSJNMTI4LjMsMTA5LjAgQzExMy44LDk5LjcgMTE5LjAsODkuNiAxMTkuMCw4OS42IEMxMjIuMCw4Mi43IDEyMC41LDc4LjYgMTIwLjUsNzguNiBDMTE5LjIsNzIuMCAxMjMuNCw3Ni4zIDEyMy40LDc2LjMgQzEyNy4zLDgwLjkgMTI1LjUsODcuMyAxMjUuNSw4Ny4zIEMxMjIuOSw5Ny42IDEzMC42LDEwMS45IDEzNC40LDEwMy4yIiBmaWxsPSJjdXJyZW50Q29sb3IiIHN0eWxlPSJ0cmFuc2Zvcm0tb3JpZ2luOiAxMzBweCAxMDZweDsiIGNsYXNzPSJvY3RvLWFybSI+PC9wYXRoPjxwYXRoIGQ9Ik0xMTUuMCwxMTUuMCBDMTE0LjksMTE1LjEgMTE4LjcsMTE2LjUgMTE5LjgsMTE1LjQgTDEzMy43LDEwMS42IEMxMzYuOSw5OS4yIDEzOS45LDk4LjQgMTQyLjIsOTguNiBDMTMzLjgsODguMCAxMjcuNSw3NC40IDE0My44LDU4LjAgQzE0OC41LDUzLjQgMTU0LjAsNTEuMiAxNTkuNyw1MS4wIEMxNjAuMyw0OS40IDE2My4yLDQzLjYgMTcxLjQsNDAuMSBDMTcxLjQsNDAuMSAxNzYuMSw0Mi41IDE3OC44LDU2LjIgQzE4My4xLDU4LjYgMTg3LjIsNjEuOCAxOTAuOSw2NS40IEMxOTQuNSw2OS4wIDE5Ny43LDczLjIgMjAwLjEsNzcuNiBDMjEzLjgsODAuMiAyMTYuMyw4NC45IDIxNi4zLDg0LjkgQzIxMi43LDkzLjEgMjA2LjksOTYuMCAyMDUuNCw5Ni42IEMyMDUuMSwxMDIuNCAyMDMuMCwxMDcuOCAxOTguMywxMTIuNSBDMTgxLjksMTI4LjkgMTY4LjMsMTIyLjUgMTU3LjcsMTE0LjEgQzE1Ny45LDExNi45IDE1Ni43LDEyMC45IDE1Mi43LDEyNC45IEwxNDEuMCwxMzYuNSBDMTM5LjgsMTM3LjcgMTQxLjYsMTQxLjkgMTQxLjgsMTQxLjggWiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0ib2N0by1ib2R5Ij48L3BhdGg+PC9zdmc+PC9hPjxzdHlsZT4uZ2l0aHViLWNvcm5lcjpob3ZlciAub2N0by1hcm17YW5pbWF0aW9uOm9jdG9jYXQtd2F2ZSA1NjBtcyBlYXNlLWluLW91dH1Aa2V5ZnJhbWVzIG9jdG9jYXQtd2F2ZXswJSwxMDAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MjAlLDYwJXt0cmFuc2Zvcm06cm90YXRlKC0yNWRlZyl9NDAlLDgwJXt0cmFuc2Zvcm06cm90YXRlKDEwZGVnKX19QG1lZGlhIChtYXgtd2lkdGg6NTAwcHgpey5naXRodWItY29ybmVyOmhvdmVyIC5vY3RvLWFybXthbmltYXRpb246bm9uZX0uZ2l0aHViLWNvcm5lciAub2N0by1hcm17YW5pbWF0aW9uOm9jdG9jYXQtd2F2ZSA1NjBtcyBlYXNlLWluLW91dH19PC9zdHlsZT4NCg0KPHNjcmlwdD4NCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsNCiAgICAkKCdwcmUucicpLmFkZENsYXNzKCdpbmRlbnQnKTsNCiAgICAkKCdwJykuYWRkQ2xhc3MoJ2luZGVudCcpOw0KfSk7DQo8L3NjcmlwdD4NCg0KPHN0eWxlPg0KLmluZGVudCB7DQogbWFyZ2luLWxlZnQ6IDMwcHg7DQp9DQo8L3N0eWxlPg0KDQombmJzcDs=